package io.geekidea.boot.util.baiwangApi;

import com.baiwang.open.client.BWRestClient;
import com.baiwang.open.client.IBWClient;
import com.baiwang.open.client.login.BopLoginClient;
import com.baiwang.open.client.login.BopLoginResponse;
import com.baiwang.open.client.login.PasswordLoginClient;
import com.baiwang.open.client.login.PasswordLoginConfig;
import com.baiwang.open.entity.request.SOutputinvoiceQueryPageRequest;
import com.baiwang.open.entity.response.SOutputinvoiceQueryPageResponse;
import com.baiwang.open.exception.BWOpenException;
import io.geekidea.boot.config.baiwang.BaiwangConfig;
import org.springframework.stereotype.Component;

import java.util.UUID;

/**
 * 分页查询发票 ____未启用
 */
@Component
public class QueryPage {
    static String url = BaiwangConfig.getUrl();
    static String appKey = BaiwangConfig.getAppKey();
    static String userName = BaiwangConfig.getUserName();
    static String password = BaiwangConfig.getPassword();
    static String appSecret = BaiwangConfig.getAppSecret();
    static String userSalt = BaiwangConfig.getUserSalt();

    public static void queryPageInvoice() throws Exception {
        try {
            String requestId = UUID.randomUUID().toString(); //自定义请求唯一标识
            PasswordLoginConfig loginConfig = new PasswordLoginConfig();
            loginConfig.setUrl(url);
            loginConfig.setClientId(appKey);
            loginConfig.setClientSecret(appSecret);
            loginConfig.setUsername(userName);
            loginConfig.setPassword(password);
            loginConfig.setUserSalt(userSalt);
            BopLoginClient loginClient = new PasswordLoginClient(loginConfig);
            // 获取token, token相关说明请参考 文档中心 -> 用户授权说明
            BopLoginResponse loginResponse = loginClient.login();
            // 重载方法，可以传自定义请求唯一标识
            // BopLoginResponse loginResponse = loginClient.login(requestId);
            String token = loginResponse.getResponse().getAccessToken();
            SOutputinvoiceQueryPageRequest request = new SOutputinvoiceQueryPageRequest();
            request.setOrderNo("2025090916153900001B"); // 非必填：开票单号（类型：String，长度：64）
            request.setBuyerTaxNo(""); // 非必填：购方税号（类型：String，长度：20）
            request.setEndDate(""); // 非必填：结束时间（格式：yyyy-MM-dd HH:mm:ss，类型：String，长度：14）
            request.setBeginDate(""); // 非必填：开始时间（格式：yyyy-MM-dd HH:mm:ss，类型：String，长度：14）
            request.setDetailMark(""); // 非必填：是否需要发票明细（0-不需要，1-需要，默认不需要，类型：String，长度：1）
            request.setPageSize("100"); // 非必填：每页条数（默认10条，最大支持100条，类型：String，长度：10）
            request.setRequestSource(""); // 非必填：开票方式（请求来源，类型：String，长度：3）
            request.setInvoiceSpecialMark(""); // 非必填：特定业务标志（默认00，00-普通发票/01-成品油/02-稀土等，类型：String，长度：3）
            request.setBuyerName(""); // 非必填：购方名称（支持左匹配模糊查询，类型：String，长度：100）
            request.setInvoiceCode(""); // 非必填：发票代码（类型：String，长度：12）
            request.setSerialNo(""); // 非必填：申请流水号（类型：String，长度：20）
            request.setBizContractNo(""); // 非必填：合同号（类型：String，长度：20）
            request.setDigitInvoiceNo(""); // 非必填：数电发票号码（类型：String，长度：20）
            request.setDateType(""); // 非必填：查询时间类型（1-创建时间，2-状态更新时间，3-开票时间，默认1，类型：String，长度：1）
            request.setPageNo(""); // 非必填：当前页码（默认第1页，类型：String，长度：10）
            request.setInvoiceTypeCode(""); // 非必填：发票种类编码（01-数电专票/02-数电普票/004-增值税专票等，类型：String，长度：3）
            request.setTaxNo("338888888888SMB"); // 必填：销方税号（类型：String，长度：20）
            request.setInvoiceNo(""); // 非必填：发票号码（类型：String，长度：8）
            request.setBizOrderNo(""); // 非必填：业务订单号（类型：String，长度：20）
            IBWClient client = new BWRestClient(url, appKey, appSecret); // 初始化一个客户端
            //IBWClient client = new BWRestClient(url, appKey, appSecret, loginClient); // 初始化一个客户端,构造函数中传入loginConfig对象参数可针对‘token错误’异常进行重试1次。
            SOutputinvoiceQueryPageResponse response = client.sOutputinvoice().queryPage(request, token);
            // 重载方法，可以传自定义请求唯一标识
            // SOutputinvoiceQueryPageResponse response = client.sOutputinvoice().queryPage(request, token, requestId);
            System.out.println(response);
        } catch (BWOpenException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            System.out.println(e.getSubCode());
            System.out.println(e.getSubMessage());
        }
    }
}